package cn.tedu.order.tcc;

import io.seata.rm.tcc.api.*;

import java.math.BigDecimal;


/*
按照 Seata 的规则，实现 TccAction 接口
1. 添加 @LocalTCC 注解
2. 添加三个方法--TCC方法
3. 第一个方法上，添加“两阶段业务操作”注解，
   并指定后面两个方法的方法名
4. 三个方法上添加 BusinessActionContext 参数，
   用来从第一个阶段向第二个阶段传递参数
5. 传递的参数数据，用 @BusinessActionContextParameter 注解放入上下文对象
 */
@LocalTCC
public interface OrderTccAction {
    /*
    避开seata的bug，订单数据一个一个单独传递，而不用封装的 Order 对象
     */
    @TwoPhaseBusinessAction(name = "OrderTccAction")
    boolean prepare(BusinessActionContext ctx,
                    @BusinessActionContextParameter(paramName = "orderId") Long orderId,
                    Long userId,
                    Long productId,
                    Integer count,
                    BigDecimal money);

    boolean commit(BusinessActionContext ctx);
    boolean rollback(BusinessActionContext ctx);
}
